package com.eliaukjq.xunlianying.duoxianchengjichu;

/**
 * @Author : 佩萁
 * Description :
 * @Create : 2024/7/21 - 9:15
 */
public class ThreadLocalExample {
    public static void main(String[] args) {
        ThreadLocal<String> threadLocal = new ThreadLocal<>();
        threadLocal.set("Hello, World!");

        System.out.println("Value before GC: " + threadLocal.get());

        threadLocal = null; // 移除强引用

        System.gc(); // 触发垃圾回收

        // 由于 ThreadLocal 对象已经被回收，ThreadLocalMap 中的键变成 null，值仍然存在但不可访问
        // 调用 remove() 方法来清理遗留的值
        // 注意，这里我们已经不能直接访问 threadLocal 的 remove 方法，因为强引用已经被移除
        // 如果要清理，必须在移除强引用之前调用 remove()

        // 因此，这段代码需要调整一下执行顺序
        ThreadLocal<String> anotherThreadLocal = new ThreadLocal<>();
        anotherThreadLocal.set("Hello again!");
        anotherThreadLocal.remove(); // 这才是正确的清理方式

        System.out.println("Value after GC: " + anotherThreadLocal.get()); // 应该输出 null
    }
}
